package com.newtouch.bxzs.database.controller;

import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.newtouch.bxzs.common.base.response.BaseResponse;
import com.newtouch.bxzs.common.base.response.RespGenerator;
import com.newtouch.bxzs.common.base.util.RedisUtils;
import com.newtouch.bxzs.database.config.MyLog;
import com.newtouch.bxzs.database.model.bo.SystemParameterBO;
import com.newtouch.bxzs.database.model.vo.SystemParameterAddVO;
import com.newtouch.bxzs.database.model.vo.SystemParameterChangeVO;
import com.newtouch.bxzs.database.model.vo.SystemParameterVO;
import com.newtouch.bxzs.database.model.vo.SystemParameterValueVO;
import com.newtouch.bxzs.database.service.SystemParameterService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.annotations.ApiIgnore;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.List;

/**
 * 系统参数管理接口的controller类
 *
 * <p>
 * <b>History:</b>
 * <table border="1">
 * <tr>
 * <th>Date</th>
 * <th>Operator</th>
 * <th>Memo</th>
 * </tr>
 * <tr>
 * <td>2021/1/4</td>
 * <td>zhangqianyang</td>
 * <td>Create</td>
 * </tr>
 * </table>
 *
 * @author zhangqianyang
 * @version 1.0.0
 * @since 1.0.0
 */

@Api(tags = "系统参数管理")
@RestController
@SuppressWarnings("unchecked")
@RequestMapping("/systemParameterController")
public class SystemParameterController {

	@Resource
	private SystemParameterService systemParameterService;
	@Autowired
	private RedisUtils redisUtils;

	/**
	 * 静态变量：日志
	 */
	private static final Log logger = LogFactory.getLog(SystemParameterController.class);

	@ApiOperation("获取系统参数列表")
	@PostMapping("/getSystemParameter")
	@MyLog(systemFunctionName = "系统参数管理", systemFunctionUrl = "/systemParameterController/getSystemParameter", userOperationType = 4, userOperationSummary = "获取系统参数列表")
	public BaseResponse<IPage<SystemParameterBO>> getSystemParameterList(
			@RequestBody SystemParameterVO systemParameterVO) {
		logger.info("开始获取系统参数列表");
		return RespGenerator.returnOK(systemParameterService.getSystemParameterList(systemParameterVO));
	}

	@ApiOperation("启用/禁用系统参数")
	@PostMapping("/changeSystemParameterStatus")
	@MyLog(systemFunctionName = "系统参数管理", systemFunctionUrl = "/systemParameterController/changeSystemParameterStatus", userOperationType = 2, userOperationSummary = "启用/禁用系统参数")
	public BaseResponse<String> changeSystemParameterStatus(
			@RequestBody SystemParameterChangeVO systemParameterChangeVO) {
		logger.info("启用或者禁用系统参数");
		String message = systemParameterService.changeSystemParameterStatus(systemParameterChangeVO);
		// 根据id获取code，和value
		SystemParameterBO data = systemParameterService
				.getSystemParameterDetail(systemParameterChangeVO.getSystemParameterId());
		if (systemParameterChangeVO.getEnableFlag()) {
			// 启用，加缓存
			logger.info("启用，加缓存");
			redisUtils.getAndSet(data.getSystemParameterCode().toUpperCase(), data.getSystemParameterValue());
		} else {
			// 禁用，删缓存
			logger.info("启用，删缓存");
			redisUtils.delete(data.getSystemParameterCode());
		}
		return RespGenerator.returnOK(message);
	}

	@ApiOperation("修改系统参数值")
	@PostMapping("/changeSystemParameterValue")
	@MyLog(systemFunctionName = "系统参数管理", systemFunctionUrl = "/systemParameterController/changeSystemParameterValue", userOperationType = 2, userOperationSummary = "修改系统参数值")
	public BaseResponse<String> changeSystemParameterValue(@RequestBody SystemParameterValueVO systemParameterValueVO) {
		logger.info("修改系统参数值");
		String message = systemParameterService.changeSystemParameterValue(systemParameterValueVO);
		// 更新缓存
		logger.info("更新缓存");
		redisUtils.getAndSet(systemParameterService
				.getSystemParameterDetail(systemParameterValueVO.getSystemParameterId()).getSystemParameterCode(),
				systemParameterValueVO.getSystemParameterValue());
		return RespGenerator.returnOK(message);
	}

	@ApiOperation("新增系统参数(用于后端测试)")
	@ApiIgnore
	@PostMapping("/addSystemParameter")
	public BaseResponse<String> addSystemParameter(@RequestBody SystemParameterAddVO systemParameterAddVO) {
		logger.info("新增系统参数");
		return RespGenerator.returnOK(systemParameterService.addSystemParameter(systemParameterAddVO));
	}

	@ApiOperation("获取系统参数详细信息(修改调用)")
	@PostMapping("/getSystemParameterDetail")
	@MyLog(systemFunctionName = "系统参数管理", systemFunctionUrl = "/systemParameterController/getSystemParameterDetail", userOperationType = 2, userOperationSummary = "获取系统参数详细信息")
	public BaseResponse<SystemParameterBO> getSystemParameterDetail(
			@RequestBody @ApiParam(name = "parameterId", value = "系统参数id", required = true) String parameterId) {
		logger.info("获取系统参数详细信息");
		return RespGenerator.returnOK(systemParameterService.getSystemParameterDetail(parameterId));
	}

	@ApiIgnore
	@GetMapping("/initSystemParameter")
	private void initSystemParameter() {
		this.getAllSystemParameter();
	}

	/**
	 * 启动加载所有系统配置到REDIS缓存
	 */
	@PostConstruct
	private void getAllSystemParameter() {
		List<SystemParameterBO> bos = systemParameterService.getAllSystemParameter();
		if (!CollectionUtil.isEmpty(bos)) {
			// 写入缓存
			for (SystemParameterBO bo : bos) {
				redisUtils.getAndSet(bo.getSystemParameterCode().toUpperCase(), bo.getSystemParameterValue());
			}
		}
	}
}
